package com.ruoyi.system.controller;

import com.ruoyi.system.mapper.AnnouncementMapper;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

// 定义一个 WebSocket 处理类，继承自 Spring 的 TextWebSocketHandler，用于处理文本类型的消息
public class AnnouncementWebSocketHandler extends TextWebSocketHandler{

    @Autowired
    private AnnouncementMapper announcementMapper;

    // 使用一个线程安全的集合保存所有活跃的 WebSocket 会话（客户端连接）
    private static final Set<WebSocketSession> sessions = Collections.synchronizedSet(new HashSet<>());

    // 当有客户端建立连接时调用此方法
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        // 将该客户端连接加入活跃连接集合中
        sessions.add(session);
    }

    // 当服务器收到来自客户端的文本消息时调用此方法
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        //// 获取消息的原始内容（JSON 字符串）
        String payload = message.getPayload();

        //将字符串解析为json对象
        JSONObject json = new JSONObject(payload);

        //已读
        if ("read".equals(json.getString("action"))){
            //从消息中获取公告id
            String announcementId = json.get("announcementId").toString();
            //先把数据库中的数据修改了
            announcementMapper.cxsUpdate(Long.valueOf(announcementId));

            //通知客户端公告id为announcementId的最新状态
            broadcast(announcementId);


        }
    }

    // 当有客户端连接关闭时调用此方法
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
        // 从活跃连接集合中移除该会话
        sessions.remove(session);
    }

    //广播
    private void broadcast(String announcementId){
        //构造数据
        JSONObject msg = new JSONObject();
        msg.put("announcementId",announcementId);

        // 遍历所有活跃的连接，向每个连接发送最新的阅读状态
        sessions.forEach(session ->{
            try {
                if (session.isOpen()){
                    // 向客户端发送 JSON 消息
                    session.sendMessage(new TextMessage(msg.toString()));
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
    }

}
